Page實際上是繼承models,所以任何使用在models裡面的欄位都可以使用,讓我們先回到models.py來看看我們剛剛做了什麼
class HomePage(Page):
body = RichTextField(blank=True)
content_panels = Page.content_panels + [
FieldPanel('body',classname="full"),
]
在這裡我們定義了一個欄位 - body,他的型態是RichTextField,他是Wagtail定義的欄位,我們來看看官網的文件
RichtextField - For rich text content
很好,有看沒有懂
它其實是存取WYSIWYG editor的內容(也就是你在後台介面的那個Body欄位所使用的Editor)
配合在html裡面所使用的模板語言
{{ page.body|richtext }}
會把存在資料庫裡面的內容,轉換成你在後台介面輸入時看到的樣子
接下來,我們看看下面這個例子
class BlogPage(Page):
# Database fields
template = 'other_template.html'
body = RichTextField()
date = models.DateField("Post date")
feed_image = models.ForeignKey(
'wagtailimages.Image',
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='+'
)
# Search index configuration
search_fields = Page.search_fields + [
index.SearchField('body'),
index.FilterField('date'),
]
# Editor panels configuration
content_panels = Page.content_panels + [
FieldPanel('date'),
FieldPanel('body', classname="full"),
]
promote_panels = [
MultiFieldPanel(Page.promote_panels, "Common page configuration"),
ImageChooserPanel('feed_image'),
]
# Parent page / subpage type rules
parent_page_types = ['blog.BlogIndex']
subpage_types = []
def get_context(self, request):
context = super().get_context(request)
return context
search_fields的目的是當實作Wagtail search的時候所要搜尋的欄位
在這個例子中,body和date兩個欄位都會建立index,但作search的時候實際上只會比對SearchField,而FilterField則是讓使用者可以對搜尋結果做Filter。
關於search功能之後會再進行詳述。
相對search_fields,content_fields則是決定提供什麼欄位在後台提供填寫。
給meta data使用的,比如說page的tag,或者該page的代表圖片
他的父頁面和子頁面限制是哪些,避免使用了不該使用的page當作他的相關頁面
他跟Django的class based view概念一樣,可以藉由複寫getContext可以新增要顯示的資料到要傳給頁面的字典中。
同樣的,如果不想使用它默認的html檔名,可以用template這個變數來更改使用的html檔案。
或者覆寫get_template動態選擇要使用的template
每個page都有serve這個方法來調動getContext和getTemplate來進行最後page的render,如果想要把顯示頁面,改成顯示json的話,可以覆寫serve如下
def serve(self, request):
return JsonResponse({
'title': self.title,
'body': self.body,
'date': self.date,
'feed_image': self.feed_image.get_rendition('width-300').url,
})
###對Page進行CRUD
由於Page是一種model,所以平常對model進行的操作方法基本上都可以使用
如
BlogPage.objects.all()
或者
BlogPage.objects.filter(title='hello')
因為Page算是Wagtail裡面最重要的東西,
今天花了一篇來解釋他,希望大家看得懂。